# Functions and information taken from these two sources. 
## https://scrnaseq-course.cog.sanger.ac.uk/website/biological-analysis.html#pseudotime-analysis
# https://stemangiola.github.io/tidyseurat/


#Load in .rds object containing filtered and clustered data.
kerato <- readRDS(file = "pseudoSLkera.rds")

#load all libraries. 
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:GenomicRanges’:

    intersect, setdiff, union

The following object is masked from ‘package:GenomeInfoDb’:

    intersect

The following objects are masked from ‘package:IRanges’:

    collapse, desc, intersect, setdiff, slice, union

The following objects are masked from ‘package:S4Vectors’:

    first, intersect, rename, setdiff, setequal, union

The following object is masked from ‘package:matrixStats’:

    count

The following object is masked from ‘package:Biobase’:

    combine

The following objects are masked from ‘package:BiocGenerics’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(Seurat)
Attaching SeuratObject

Attaching package: ‘Seurat’

The following object is masked from ‘package:SummarizedExperiment’:

    Assays
library(patchwork)
library(data.table)
data.table 1.14.0 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********

Attaching package: ‘data.table’

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:SummarizedExperiment’:

    shift

The following object is masked from ‘package:GenomicRanges’:

    shift

The following object is masked from ‘package:IRanges’:

    shift

The following objects are masked from ‘package:S4Vectors’:

    first, second
library(stringr)
library(ggplot2)
non-uniform 'Rounding' sampler used
library(Signac)
library(SeuratWrappers)
library(monocle3)
library(Matrix)

Attaching package: ‘Matrix’

The following object is masked from ‘package:S4Vectors’:

    expand
library(tidyseurat)
========================================
tidyseurat version 0.2.7
To restore the Seurat default display use options("restore_Seurat_show" = TRUE) 
========================================


Attaching package: ‘tidyseurat’

The following objects are masked from ‘package:dplyr’:

    add_count, bind_cols, bind_rows, count

The following object is masked from ‘package:IRanges’:

    slice

The following object is masked from ‘package:S4Vectors’:

    rename

The following object is masked from ‘package:matrixStats’:

    count

The following object is masked from ‘package:stats’:

    filter
library(DEGreport)
set.seed(1234)

#working directory, change if using on system other than authors to folder with.rds file in. 
setwd("~/OneDrive - Queen Mary, University of London/QMUL/Lab/Coding/data/R/Seurat/SandLKerato")
# this section builds lists containing gene IDs. These IDs are sorted into lists related to their function and/or their research area associated with them. 

# kerato_marker_genes contain general keratinocyte differentiation markers.
kerato_marker_genes <- c("Krt10", "Krt5", "Krt14", "Sprr1a", "Sprr1b", "Evpl", "Dsp", "Ppl", "Klk11", "Spink5", "Klf4", "Klk6", "Klk7", "Klk8", "Klk10")

# cell_state_markers contains genes used to mark the cell cycle state of cells, in this case currently proliferative markers. 
cell_state_markers <- c("Mki67","Pcna")

# actin_markers contains all genes associated with the actin cytoskeleton. 
actin_markers <- c("Arhgdia","Camsap2", "Anxa1", "Rflnb", "Tmsb4x", "Arpc1b", "Sbsn","Dsg3", "Ahnak", "Cdh1", "Col3a1", "Tpt1", "Lgals7", "Rack1", "S100a11", "Eef1b2", "Ran", "Sprr1a", "Klf8", "Ptprf")

# plmn_markers has putative lamin bodies markers investigated. 
plmn_markers <- c("Ipo7", "Ran", "Snupn", "Matr3", "Nup153")

# SGPB_markers contains genes associated with condensates, primarly stress granules and P bodies.
SGPB_markers <- c("Ddx6", "Eif4e", "Nxf1", "Lsm14a", "Caprin1", "Csde1", "Pum1", "Zfp36")

# other_markers contains miscellaneous markers, notes below variable show reasoning. 
other_markers <- c("Snhg11", "Fabp5", "Slc25a4", "Lgals7", "Tacstd2", "Fosb", "Cd44", "Trpv4", "Trpm4" )

#Tr genes are calcium channels found specifically in UGL Matsui 2021
#kerato market genes not found
#("Klk5"))("Klk2"))("Klk3"))("Klk4"))("Klk9"))
# ("Crnn")) Cornulin  ("Sprr2a")) not found ("Sprr2b")) ("Sprr2c"))
# ("Sprr2d")) ("Sprr2e")) ("Sprr2f")) ("Sprr2g")) ("Sprr3")) ("Sprr4"))
# ("AABR07012329.1")) ("Lor")) ("Flg")) ("Rgpd1")) ("Syne4")) Dcp2, 

#dsg1, dsp - spinous, 
# spink5, granular

#Dsp, Ppl, Evpl

#combines all above lists into one superlist 'list_of_features', which is then parsed to later image functions. 
list_of_features <- c(kerato_marker_genes, cell_state_markers, actin_markers, plmn_markers, SGPB_markers, other_markers)
# will make variable 'tidykerato', a form of object that can be easily parsed to data analysis, similar to tibble. 
# tidykerato <- tidyseurat::kerato
# using pipes to push kerato QC data into boxplots. The three major QC covariates are plotted against frequency over the clusters. 

# Number of counts of RNA per barcode. 
kerato %>%
  tidyseurat::ggplot(aes(seurat_clusters, nCount_RNA, fill = seurat_clusters)) + # using ggplot2 aesthetics to change labels and add jitter. 
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.1) +
  xlab('Cluster') +
  ylab('RNA Read Count') +
  labs(fill = "Cluster") + theme(legend.position="none")


# Number of features per barcode. 
kerato %>%
  tidyseurat::ggplot(aes(seurat_clusters, nFeature_RNA, fill = seurat_clusters)) +
  geom_boxplot(outlier.shape = NA) + # using ggplot2 aesthetics to change labels and add jitter. 
  geom_jitter(width = 0.1) +
  xlab('Cluster') +
  ylab('RNA Feature Count') +
  labs(fill = "Cluster") + theme(legend.position="none")

  
# Percentage mitochondrial RNA content per barcode. 
kerato %>%
  tidyseurat::ggplot(aes(seurat_clusters, percent.mt, fill = seurat_clusters)) +
  geom_boxplot(outlier.shape = NA) + # using ggplot2 aesthetics to change labels and add jitter. 
  geom_jitter(width = 0.1) +
  xlab('Cluster') +
  ylab('Percentage mitochondrial RNA') +
  labs(fill = "Cluster") + theme(legend.position="none")

NA
NA



VlnPlot(kerato, features = c("percent.mt")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Percentage mitochondrial RNA") + theme(axis.title.x = element_blank())


VlnPlot(kerato, features = c("nFeature_RNA")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Number of features") + theme(axis.title.x = element_blank())



VlnPlot(kerato, features = c("nCount_RNA")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Number of counts") + theme(axis.title.x = element_blank())

# Chunk printing QC metrics to console, allows extraction and analysis of statistics. 

cat('counts')
counts
summary(kerato$nCount_RNA)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    245     608    4710   10898   14239   83967 
cat('mito')
mito
summary(kerato$percent.mt)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.7492  5.5753 13.9546 26.2964 49.1361 
cat('features')
features
summary(kerato$nFeature_RNA)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  201.0   372.5  1286.0  1765.8  2797.0  5936.0 
# Parse list_of_features to FeaturePlot, which gives heatmaps of the clusters showing a features expression. 

for (gene in list_of_features){

  p <- FeaturePlot(kerato, features = (gene))
  print(p)
}


# Use this line to see single feature plot, for ease. 
FeaturePlot(kerato, features = "Sbsn")

for (gene in actin_markers){

  p <- FeaturePlot(kerato, features = (gene))
  print(p)
}

# Parse QC metrics to FeaturePlot, which gives heatmaps of the clusters showing a features expression. 

FeaturePlot(kerato, features = "percent.mt", label = TRUE)

FeaturePlot(kerato, features = "percent.mt")


FeaturePlot(kerato, features = "nFeature_RNA", label = TRUE)

FeaturePlot(kerato, features = "nFeature_RNA")


FeaturePlot(kerato, features = "nCount_RNA", label = TRUE)

FeaturePlot(kerato, features = "nCount_RNA")


DimPlot(kerato, reduction = "umap", label = TRUE, pt.size = 0.5) 

# Create list of marker genes for the clusters using filters. min.pct is the minimum percentage present. only.pos selects only positive markers for this.

markers_streamlined <-
  kerato %>%
  FindAllMarkers(only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25) %>%
  group_by(cluster) %>% 
  top_n(10, avg_log2FC) # only take top ten genes.
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |+                                                 | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 20% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
# Plot heatmap
kerato %>%
  DoHeatmap(
    features = markers_streamlined$gene
    
  )


# changing text size with + theme(axis.text.y = element_text(size = 0.1)) doesn't seem to work, needs some graphical adjustments. 
# Parse QC metrics to scatter plots using geom_point (ggplot2), adding smoothened line of best fit with stat_smooth, and pearson correlation coefficient with geom_cor. 

kerato %>%
  tidyseurat::ggplot(aes(x=Pseudotime, y=nCount_RNA)) + 
  geom_point() + 
  stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) + 
  geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

kerato %>%
  tidyseurat::ggplot(aes(x=Pseudotime, y=percent.mt)) +   geom_point() + 
  stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) + 
  geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

kerato %>%
  tidyseurat::ggplot(aes(x=Pseudotime, y=nFeature_RNA)) + 
  geom_point() + 
  stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) + 
  geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

# This chunk parses all feature genes to FeatureScatter, and adds a line of best fit with standard error region present. 

for (gene in list_of_features){
  #zero_scrub <- subset(x = kerato, subset =  (as.factor('Krt10') > 0))
  # solution may be here: https://github.com/satijalab/seurat/issues/2619
  
  p <- FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (gene))
  
  print(p +
          
  theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
  stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
    
  #labels
  xlab('Pseudotime') + 
  ylab(sprintf('%s Log2 Expression', gene)) +
  labs(fill = "Cluster")) 
}


  #zero_scrub <- subset(x = kerato, subset =  (as.factor('Krt10') > 0))
  # solution may be here: https://github.com/satijalab/seurat/issues/2619
# obj_subset <- kerato[, GetAssayData(kerato[[assay]])[gene, ] > 1]
#actin_markers <- c("Arhgdia","Camsap2", "Anxa1", "Rflnb", "Tmsb4x", "Arpc1b", "Sbsn","Dsg3", "Ahnak", "Cdh1", "Col3a1", "Tpt1", "Lgals7", "Rack1", "S100a11", "Eef1b2", "Ran", "Sprr1a", "Klf8", "Ptprf") Cfl1, Ipo9, Xpo6, Tgm1

#                     set gene for line plot|
#                                           |
#                                           |
obj_subset <- subset(x = kerato, subset = Xpo6 > 0)


p <- FeatureScatter(obj_subset, feature1 = "Pseudotime", feature2 = (gene))
  
print(p +
          
theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
    
  #labels
xlab('Pseudotime') + 
ylab(sprintf('%s Log2 Expression', gene)) +
labs(fill = "Cluster")) 

for (gene in actin_markers){
  
  p <- FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (gene))
  
  print(p +
          
  theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
  stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
    
  #labels
  xlab('Pseudotime') + 
  ylab(sprintf('%s Log2 Expression', gene)) +
  labs(fill = "Cluster")) 
}

# Similar to chunk above, investigating single genes for ease of use. 

pseudotime_scatter_gene <- 'Ctsa'
#"Ddx6", "Eif4e"

#b, l, d, s, h, c, k, e, g, z, j, f, r, m, 7, a, q

FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (pseudotime_scatter_gene)) +
  theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
  stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
    
  #labels
  xlab('Pseudotime') + 
  ylab(sprintf('%s Log2 Expression', pseudotime_scatter_gene)) +
  labs(fill = "Cluster") 

FeaturePlot(kerato, features = (pseudotime_scatter_gene))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3J9CiMgRnVuY3Rpb25zIGFuZCBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZXNlIHR3byBzb3VyY2VzLiAKIyMgaHR0cHM6Ly9zY3JuYXNlcS1jb3Vyc2UuY29nLnNhbmdlci5hYy51ay93ZWJzaXRlL2Jpb2xvZ2ljYWwtYW5hbHlzaXMuaHRtbCNwc2V1ZG90aW1lLWFuYWx5c2lzCiMgaHR0cHM6Ly9zdGVtYW5naW9sYS5naXRodWIuaW8vdGlkeXNldXJhdC8KCgojTG9hZCBpbiAucmRzIG9iamVjdCBjb250YWluaW5nIGZpbHRlcmVkIGFuZCBjbHVzdGVyZWQgZGF0YS4Ka2VyYXRvIDwtIHJlYWRSRFMoZmlsZSA9ICJwc2V1ZG9TTGtlcmEucmRzIikKCiNsb2FkIGFsbCBsaWJyYXJpZXMuIApsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoU2lnbmFjKQpsaWJyYXJ5KFNldXJhdFdyYXBwZXJzKQpsaWJyYXJ5KG1vbm9jbGUzKQpsaWJyYXJ5KE1hdHJpeCkKbGlicmFyeSh0aWR5c2V1cmF0KQpsaWJyYXJ5KERFR3JlcG9ydCkKc2V0LnNlZWQoMTIzNCkKCiN3b3JraW5nIGRpcmVjdG9yeSwgY2hhbmdlIGlmIHVzaW5nIG9uIHN5c3RlbSBvdGhlciB0aGFuIGF1dGhvcnMgdG8gZm9sZGVyIHdpdGgucmRzIGZpbGUgaW4uIApzZXR3ZCgifi9PbmVEcml2ZSAtIFF1ZWVuIE1hcnksIFVuaXZlcnNpdHkgb2YgTG9uZG9uL1FNVUwvTGFiL0NvZGluZy9kYXRhL1IvU2V1cmF0L1NhbmRMS2VyYXRvIikKCmBgYAoKCmBgYHtyfQojIHRoaXMgc2VjdGlvbiBidWlsZHMgbGlzdHMgY29udGFpbmluZyBnZW5lIElEcy4gVGhlc2UgSURzIGFyZSBzb3J0ZWQgaW50byBsaXN0cyByZWxhdGVkIHRvIHRoZWlyIGZ1bmN0aW9uIGFuZC9vciB0aGVpciByZXNlYXJjaCBhcmVhIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAKCiMga2VyYXRvX21hcmtlcl9nZW5lcyBjb250YWluIGdlbmVyYWwga2VyYXRpbm9jeXRlIGRpZmZlcmVudGlhdGlvbiBtYXJrZXJzLgprZXJhdG9fbWFya2VyX2dlbmVzIDwtIGMoIktydDEwIiwgIktydDUiLCAiS3J0MTQiLCAiU3BycjFhIiwgIlNwcnIxYiIsICJFdnBsIiwgIkRzcCIsICJQcGwiLCAiS2xrMTEiLCAiU3Bpbms1IiwgIktsZjQiLCAiS2xrNiIsICJLbGs3IiwgIktsazgiLCAiS2xrMTAiKQoKIyBjZWxsX3N0YXRlX21hcmtlcnMgY29udGFpbnMgZ2VuZXMgdXNlZCB0byBtYXJrIHRoZSBjZWxsIGN5Y2xlIHN0YXRlIG9mIGNlbGxzLCBpbiB0aGlzIGNhc2UgY3VycmVudGx5IHByb2xpZmVyYXRpdmUgbWFya2Vycy4gCmNlbGxfc3RhdGVfbWFya2VycyA8LSBjKCJNa2k2NyIsIlBjbmEiKQoKIyBhY3Rpbl9tYXJrZXJzIGNvbnRhaW5zIGFsbCBnZW5lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGluIGN5dG9za2VsZXRvbi4gCmFjdGluX21hcmtlcnMgPC0gYygiQXJoZ2RpYSIsIkNhbXNhcDIiLCAiQW54YTEiLCAiUmZsbmIiLCAiVG1zYjR4IiwgIkFycGMxYiIsICJTYnNuIiwiRHNnMyIsICJBaG5hayIsICJDZGgxIiwgIkNvbDNhMSIsICJUcHQxIiwgIkxnYWxzNyIsICJSYWNrMSIsICJTMTAwYTExIiwgIkVlZjFiMiIsICJSYW4iLCAiU3BycjFhIiwgIktsZjgiLCAiUHRwcmYiKQoKIyBwbG1uX21hcmtlcnMgaGFzIHB1dGF0aXZlIGxhbWluIGJvZGllcyBtYXJrZXJzIGludmVzdGlnYXRlZC4gCnBsbW5fbWFya2VycyA8LSBjKCJJcG83IiwgIlJhbiIsICJTbnVwbiIsICJNYXRyMyIsICJOdXAxNTMiKQoKIyBTR1BCX21hcmtlcnMgY29udGFpbnMgZ2VuZXMgYXNzb2NpYXRlZCB3aXRoIGNvbmRlbnNhdGVzLCBwcmltYXJseSBzdHJlc3MgZ3JhbnVsZXMgYW5kIFAgYm9kaWVzLgpTR1BCX21hcmtlcnMgPC0gYygiRGR4NiIsICJFaWY0ZSIsICJOeGYxIiwgIkxzbTE0YSIsICJDYXByaW4xIiwgIkNzZGUxIiwgIlB1bTEiLCAiWmZwMzYiKQoKIyBvdGhlcl9tYXJrZXJzIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgbWFya2Vycywgbm90ZXMgYmVsb3cgdmFyaWFibGUgc2hvdyByZWFzb25pbmcuIApvdGhlcl9tYXJrZXJzIDwtIGMoIlNuaGcxMSIsICJGYWJwNSIsICJTbGMyNWE0IiwgIkxnYWxzNyIsICJUYWNzdGQyIiwgIkZvc2IiLCAiQ2Q0NCIsICJUcnB2NCIsICJUcnBtNCIgKQoKI1RyIGdlbmVzIGFyZSBjYWxjaXVtIGNoYW5uZWxzIGZvdW5kIHNwZWNpZmljYWxseSBpbiBVR0wgTWF0c3VpIDIwMjEKI2tlcmF0byBtYXJrZXQgZ2VuZXMgbm90IGZvdW5kCiMoIktsazUiKSkoIktsazIiKSkoIktsazMiKSkoIktsazQiKSkoIktsazkiKSkKIyAoIkNybm4iKSkgQ29ybnVsaW4gICgiU3BycjJhIikpIG5vdCBmb3VuZCAoIlNwcnIyYiIpKSAoIlNwcnIyYyIpKQojICgiU3BycjJkIikpICgiU3BycjJlIikpICgiU3BycjJmIikpICgiU3BycjJnIikpICgiU3BycjMiKSkgKCJTcHJyNCIpKQojICgiQUFCUjA3MDEyMzI5LjEiKSkgKCJMb3IiKSkgKCJGbGciKSkgKCJSZ3BkMSIpKSAoIlN5bmU0IikpIERjcDIsIAoKI2RzZzEsIGRzcCAtIHNwaW5vdXMsIAojIHNwaW5rNSwgZ3JhbnVsYXIKCiNEc3AsIFBwbCwgRXZwbAoKI2NvbWJpbmVzIGFsbCBhYm92ZSBsaXN0cyBpbnRvIG9uZSBzdXBlcmxpc3QgJ2xpc3Rfb2ZfZmVhdHVyZXMnLCB3aGljaCBpcyB0aGVuIHBhcnNlZCB0byBsYXRlciBpbWFnZSBmdW5jdGlvbnMuIApsaXN0X29mX2ZlYXR1cmVzIDwtIGMoa2VyYXRvX21hcmtlcl9nZW5lcywgY2VsbF9zdGF0ZV9tYXJrZXJzLCBhY3Rpbl9tYXJrZXJzLCBwbG1uX21hcmtlcnMsIFNHUEJfbWFya2Vycywgb3RoZXJfbWFya2VycykKYGBgCgoKYGBge3J9CiMgd2lsbCBtYWtlIHZhcmlhYmxlICd0aWR5a2VyYXRvJywgYSBmb3JtIG9mIG9iamVjdCB0aGF0IGNhbiBiZSBlYXNpbHkgcGFyc2VkIHRvIGRhdGEgYW5hbHlzaXMsIHNpbWlsYXIgdG8gdGliYmxlLiAKIyB0aWR5a2VyYXRvIDwtIHRpZHlzZXVyYXQ6OmtlcmF0bwpgYGAKCmBgYHtyfQojIHVzaW5nIHBpcGVzIHRvIHB1c2gga2VyYXRvIFFDIGRhdGEgaW50byBib3hwbG90cy4gVGhlIHRocmVlIG1ham9yIFFDIGNvdmFyaWF0ZXMgYXJlIHBsb3R0ZWQgYWdhaW5zdCBmcmVxdWVuY3kgb3ZlciB0aGUgY2x1c3RlcnMuIAoKIyBOdW1iZXIgb2YgY291bnRzIG9mIFJOQSBwZXIgYmFyY29kZS4gCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHNldXJhdF9jbHVzdGVycywgbkNvdW50X1JOQSwgZmlsbCA9IHNldXJhdF9jbHVzdGVycykpICsgIyB1c2luZyBnZ3Bsb3QyIGFlc3RoZXRpY3MgdG8gY2hhbmdlIGxhYmVscyBhbmQgYWRkIGppdHRlci4gCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgeGxhYignQ2x1c3RlcicpICsKICB5bGFiKCdSTkEgUmVhZCBDb3VudCcpICsKICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCiMgTnVtYmVyIG9mIGZlYXR1cmVzIHBlciBiYXJjb2RlLiAKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoc2V1cmF0X2NsdXN0ZXJzLCBuRmVhdHVyZV9STkEsIGZpbGwgPSBzZXVyYXRfY2x1c3RlcnMpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyAjIHVzaW5nIGdncGxvdDIgYWVzdGhldGljcyB0byBjaGFuZ2UgbGFiZWxzIGFuZCBhZGQgaml0dGVyLiAKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSkgKwogIHhsYWIoJ0NsdXN0ZXInKSArCiAgeWxhYignUk5BIEZlYXR1cmUgQ291bnQnKSArCiAgbGFicyhmaWxsID0gIkNsdXN0ZXIiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgCiMgUGVyY2VudGFnZSBtaXRvY2hvbmRyaWFsIFJOQSBjb250ZW50IHBlciBiYXJjb2RlLiAKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoc2V1cmF0X2NsdXN0ZXJzLCBwZXJjZW50Lm10LCBmaWxsID0gc2V1cmF0X2NsdXN0ZXJzKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgIyB1c2luZyBnZ3Bsb3QyIGFlc3RoZXRpY3MgdG8gY2hhbmdlIGxhYmVscyBhbmQgYWRkIGppdHRlci4gCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEpICsKICB4bGFiKCdDbHVzdGVyJykgKwogIHlsYWIoJ1BlcmNlbnRhZ2UgbWl0b2Nob25kcmlhbCBSTkEnKSArCiAgbGFicyhmaWxsID0gIkNsdXN0ZXIiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgCiAgCmBgYAoKYGBge3J9CgoKClZsblBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9IGMoInBlcmNlbnQubXQiKSkgKyBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSJDbHVzdGVyIiwgbGltaXRzPWMoIjIiLCIzIiwiMSIsICIwIiksIGxhYmVscz1jKCJTbWFsbCIsICJNaWQtc3RhZ2UiLCJMYXRlLXN0YWdlIiwgIkRlYWQiKSkgKyBnZ3RpdGxlKCJQZXJjZW50YWdlIG1pdG9jaG9uZHJpYWwgUk5BIikgKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpWbG5QbG90KGtlcmF0bywgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSkgKyBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSJDbHVzdGVyIiwgbGltaXRzPWMoIjIiLCIzIiwiMSIsICIwIiksIGxhYmVscz1jKCJTbWFsbCIsICJNaWQtc3RhZ2UiLCJMYXRlLXN0YWdlIiwgIkRlYWQiKSkgKyBnZ3RpdGxlKCJOdW1iZXIgb2YgZmVhdHVyZXMiKSArIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKCgpWbG5QbG90KGtlcmF0bywgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIikpICsgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0iQ2x1c3RlciIsIGxpbWl0cz1jKCIyIiwiMyIsIjEiLCAiMCIpLCBsYWJlbHM9YygiU21hbGwiLCAiTWlkLXN0YWdlIiwiTGF0ZS1zdGFnZSIsICJEZWFkIikpICsgZ2d0aXRsZSgiTnVtYmVyIG9mIGNvdW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKYGBgCgpgYGB7cn0KIyBDaHVuayBwcmludGluZyBRQyBtZXRyaWNzIHRvIGNvbnNvbGUsIGFsbG93cyBleHRyYWN0aW9uIGFuZCBhbmFseXNpcyBvZiBzdGF0aXN0aWNzLiAKCmNhdCgnY291bnRzJykKc3VtbWFyeShrZXJhdG8kbkNvdW50X1JOQSkKY2F0KCdtaXRvJykKc3VtbWFyeShrZXJhdG8kcGVyY2VudC5tdCkKY2F0KCdmZWF0dXJlcycpCnN1bW1hcnkoa2VyYXRvJG5GZWF0dXJlX1JOQSkKYGBgCgoKYGBge3J9CiMgUGFyc2UgbGlzdF9vZl9mZWF0dXJlcyB0byBGZWF0dXJlUGxvdCwgd2hpY2ggZ2l2ZXMgaGVhdG1hcHMgb2YgdGhlIGNsdXN0ZXJzIHNob3dpbmcgYSBmZWF0dXJlcyBleHByZXNzaW9uLiAKCmZvciAoZ2VuZSBpbiBsaXN0X29mX2ZlYXR1cmVzKXsKCiAgcCA8LSBGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gKGdlbmUpKQogIHByaW50KHApCn0KCiMgVXNlIHRoaXMgbGluZSB0byBzZWUgc2luZ2xlIGZlYXR1cmUgcGxvdCwgZm9yIGVhc2UuIApGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIlNic24iKQpgYGAKYGBge3J9CiN0aGlzIHdpbGwgcHJpbnQgYWxsIGdlbmVzIHdpdGhpbiBhIGNoYXJhY3RlciB2ZWN0b3IncyBjbHVzdGVyIGdyYXBocwoKIyBmb3IgKGdlbmUgaW4gYWN0aW5fbWFya2Vycyl7CiMgCiMgICBwIDwtIEZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAoZ2VuZSkpCiMgICBwcmludChwKQojIH0KYGBgCgoKYGBge3J9CiMgUGFyc2UgUUMgbWV0cmljcyB0byBGZWF0dXJlUGxvdCwgd2hpY2ggZ2l2ZXMgaGVhdG1hcHMgb2YgdGhlIGNsdXN0ZXJzIHNob3dpbmcgYSBmZWF0dXJlcyBleHByZXNzaW9uLiAKCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAicGVyY2VudC5tdCIsIGxhYmVsID0gVFJVRSkKRmVhdHVyZVBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9ICJwZXJjZW50Lm10IikKCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIiwgbGFiZWwgPSBUUlVFKQpGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIm5GZWF0dXJlX1JOQSIpCgpGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIm5Db3VudF9STkEiLCBsYWJlbCA9IFRSVUUpCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAibkNvdW50X1JOQSIpCgojY2x1c3RlciBncmFwaCBzaG93aW5nIGxhYmVsZWQgY2x1c3RlcnMKRGltUGxvdChrZXJhdG8sIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMC41KSAKYGBgCgoKYGBge3J9CiMgQ3JlYXRlIGxpc3Qgb2YgbWFya2VyIGdlbmVzIGZvciB0aGUgY2x1c3RlcnMgdXNpbmcgZmlsdGVycy4gbWluLnBjdCBpcyB0aGUgbWluaW11bSBwZXJjZW50YWdlIHByZXNlbnQuIG9ubHkucG9zIHNlbGVjdHMgb25seSBwb3NpdGl2ZSBtYXJrZXJzIGZvciB0aGlzLgoKbWFya2Vyc19zdHJlYW1saW5lZCA8LQogIGtlcmF0byAlPiUKICBGaW5kQWxsTWFya2Vycyhvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIAogIHRvcF9uKDEwLCBhdmdfbG9nMkZDKSAjIG9ubHkgdGFrZSB0b3AgdGVuIGdlbmVzLgoKIyBQbG90IGhlYXRtYXAKa2VyYXRvICU+JQogIERvSGVhdG1hcCgKICAgIGZlYXR1cmVzID0gbWFya2Vyc19zdHJlYW1saW5lZCRnZW5lCiAgICAKICApCgojIGNoYW5naW5nIHRleHQgc2l6ZSB3aXRoICsgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDAuMSkpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBuZWVkcyBzb21lIGdyYXBoaWNhbCBhZGp1c3RtZW50cy4gCmBgYAoKCmBgYHtyfQojIFBhcnNlIFFDIG1ldHJpY3MgdG8gc2NhdHRlciBwbG90cyB1c2luZyBnZW9tX3BvaW50IChnZ3Bsb3QyKSwgYWRkaW5nIHNtb290aGVuZWQgbGluZSBvZiBiZXN0IGZpdCB3aXRoIHN0YXRfc21vb3RoLCBhbmQgcGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB3aXRoIGdlb21fY29yLiAKCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHg9UHNldWRvdGltZSwgeT1uQ291bnRfUk5BKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBzdGF0X3Ntb290aChtZXRob2Q9ImxtIiwgc2U9VFJVRSwgY29sb3VyID0gJ2JsYWNrJywgcGxvdC5jb3IgPSBUUlVFKSArIAogIGdlb21fY29yKG1ldGhvZCA9ICJwZWFyc29uIikKCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHg9UHNldWRvdGltZSwgeT1wZXJjZW50Lm10KSkgKyAgIGdlb21fcG9pbnQoKSArIAogIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snLCBwbG90LmNvciA9IFRSVUUpICsgCiAgZ2VvbV9jb3IobWV0aG9kID0gInBlYXJzb24iKQoKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoeD1Qc2V1ZG90aW1lLCB5PW5GZWF0dXJlX1JOQSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPVRSVUUsIGNvbG91ciA9ICdibGFjaycsIHBsb3QuY29yID0gVFJVRSkgKyAKICBnZW9tX2NvcihtZXRob2QgPSAicGVhcnNvbiIpCgoKYGBgCgoKYGBge3J9CiMgVGhpcyBjaHVuayBwYXJzZXMgYWxsIGZlYXR1cmUgZ2VuZXMgdG8gRmVhdHVyZVNjYXR0ZXIsIGFuZCBhZGRzIGEgbGluZSBvZiBiZXN0IGZpdCB3aXRoIHN0YW5kYXJkIGVycm9yIHJlZ2lvbiBwcmVzZW50LiAKCiMgZm9yIChnZW5lIGluIGxpc3Rfb2ZfZmVhdHVyZXMpewojICAgI3plcm9fc2NydWIgPC0gc3Vic2V0KHggPSBrZXJhdG8sIHN1YnNldCA9ICAoYXMuZmFjdG9yKCdLcnQxMCcpID4gMCkpCiMgICAjIHNvbHV0aW9uIG1heSBiZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc2F0aWphbGFiL3NldXJhdC9pc3N1ZXMvMjYxOQojICAgCiMgICBwIDwtIEZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKGdlbmUpKQojICAgCiMgICBwcmludChwICsKIyAgICAgICAgICAgCiMgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMS4yLCB2anVzdCA9IC0yKSkgKyAjIGFkanVzdCBwZWFyc29ucyBjb2VmZmljaWVudCB0byByaWdodCBoYW5kIHNpZGUKIyAgIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiMgICAgIAojICAgI2xhYmVscwojICAgeGxhYignUHNldWRvdGltZScpICsgCiMgICB5bGFiKHNwcmludGYoJyVzIExvZzIgRXhwcmVzc2lvbicsIGdlbmUpKSArCiMgICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpKSAKIyB9CmBgYAoKYGBge3J9CgogICN6ZXJvX3NjcnViIDwtIHN1YnNldCh4ID0ga2VyYXRvLCBzdWJzZXQgPSAgKGFzLmZhY3RvcignS3J0MTAnKSA+IDApKQogICMgc29sdXRpb24gbWF5IGJlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRpamFsYWIvc2V1cmF0L2lzc3Vlcy8yNjE5CiMgb2JqX3N1YnNldCA8LSBrZXJhdG9bLCBHZXRBc3NheURhdGEoa2VyYXRvW1thc3NheV1dKVtnZW5lLCBdID4gMV0KI2FjdGluX21hcmtlcnMgPC0gYygiQXJoZ2RpYSIsIkNhbXNhcDIiLCAiQW54YTEiLCAiUmZsbmIiLCAiVG1zYjR4IiwgIkFycGMxYiIsICJTYnNuIiwiRHNnMyIsICJBaG5hayIsICJDZGgxIiwgIkNvbDNhMSIsICJUcHQxIiwgIkxnYWxzNyIsICJSYWNrMSIsICJTMTAwYTExIiwgIkVlZjFiMiIsICJSYW4iLCAiU3BycjFhIiwgIktsZjgiLCAiUHRwcmYiKSBDZmwxLCBJcG85LCBYcG82LCBUZ20xCgojICAgICAgICAgICAgICAgICAgICAgc2V0IGdlbmUgZm9yIGxpbmUgcGxvdHwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKI2V4cGVyaW1lbnQgcmVtb3ZpbmcgemVybyB2YWx1ZXMgZnJvbSBwbG90CiMgb2JqX3N1YnNldCA8LSBzdWJzZXQoeCA9IGtlcmF0bywgc3Vic2V0ID0gWHBvNiA+IDApCiMgCiMgCiMgcCA8LSBGZWF0dXJlU2NhdHRlcihvYmpfc3Vic2V0LCBmZWF0dXJlMSA9ICJQc2V1ZG90aW1lIiwgZmVhdHVyZTIgPSAoZ2VuZSkpCiMgICAKIyBwcmludChwICsKIyAgICAgICAgICAgCiMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEuMiwgdmp1c3QgPSAtMikpICsgIyBhZGp1c3QgcGVhcnNvbnMgY29lZmZpY2llbnQgdG8gcmlnaHQgaGFuZCBzaWRlCiMgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPVRSVUUsIGNvbG91ciA9ICdibGFjaycpICsgIyByZWdyZXNzaW9uIGxpbmUKIyAgICAgCiMgICAjbGFiZWxzCiMgeGxhYignUHNldWRvdGltZScpICsgCiMgeWxhYihzcHJpbnRmKCclcyBMb2cyIEV4cHJlc3Npb24nLCBnZW5lKSkgKwojIGxhYnMoZmlsbCA9ICJDbHVzdGVyIikpIAoKYGBgCgpgYGB7cn0KI2NodW5rIHBsb3R0aW5nIGFsbCBwc2V1ZG90aW1lIGxpbmUgZ3JhcGhzIGZvciBnZW5lcyBpbiBhIGNoYXJhY3RlciB2ZWN0b3IKCiMgZm9yIChnZW5lIGluIGFjdGluX21hcmtlcnMpewojICAgCiMgICBwIDwtIEZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKGdlbmUpKQojICAgCiMgICBwcmludChwICsKIyAgICAgICAgICAgCiMgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMS4yLCB2anVzdCA9IC0yKSkgKyAjIGFkanVzdCBwZWFyc29ucyBjb2VmZmljaWVudCB0byByaWdodCBoYW5kIHNpZGUKIyAgIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiMgICAgIAojICAgI2xhYmVscwojICAgeGxhYignUHNldWRvdGltZScpICsgCiMgICB5bGFiKHNwcmludGYoJyVzIExvZzIgRXhwcmVzc2lvbicsIGdlbmUpKSArCiMgICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpKSAKIyB9CmBgYAoKCmBgYHtyfQojIFNpbWlsYXIgdG8gY2h1bmsgYWJvdmUsIGludmVzdGlnYXRpbmcgc2luZ2xlIGdlbmVzIGZvciBlYXNlIG9mIHVzZS4gCgpwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSA8LSAnQ3RzYScKIyJEZHg2IiwgIkVpZjRlIgoKI2IsIGwsIGQsIHMsIGgsIGMsIGssIGUsIGcsIHosIGosIGYsIHIsIG0sIDcsIGEsIHEKCkZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKHBzZXVkb3RpbWVfc2NhdHRlcl9nZW5lKSkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLjIsIHZqdXN0ID0gLTIpKSArICMgYWRqdXN0IHBlYXJzb25zIGNvZWZmaWNpZW50IHRvIHJpZ2h0IGhhbmQgc2lkZQogIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiAgICAKICAjbGFiZWxzCiAgeGxhYignUHNldWRvdGltZScpICsgCiAgeWxhYihzcHJpbnRmKCclcyBMb2cyIEV4cHJlc3Npb24nLCBwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSkpICsKICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpIAoKRmVhdHVyZVBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9IChwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSkpCgpgYGAKCgoK